"""
全局配置文件

定义项目的各种配置参数，包括爬取设置、日志配置等。
"""

import os
from typing import Dict, Any
from pathlib import Path

# 项目根目录
PROJECT_ROOT = Path(__file__).parent.parent

# 输出目录配置
OUTPUT_DIR = PROJECT_ROOT / "output"
LOGS_DIR = PROJECT_ROOT / "logs"

# 确保目录存在
OUTPUT_DIR.mkdir(exist_ok=True)
LOGS_DIR.mkdir(exist_ok=True)

# 爬虫配置
SCRAPER_CONFIG = {
    # 默认超时时间（秒）
    'DEFAULT_TIMEOUT': 30,

    # 默认重试次数
    'DEFAULT_MAX_RETRIES': 3,

    # 默认请求间隔（秒）
    'DEFAULT_DELAY': 1.0,

    # 用户代理
    'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',

    # 请求头
    'HEADERS': {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1',
    },

    # Selenium配置
    'SELENIUM': {
        'HEADLESS': True,  # 无头模式
        'WINDOW_SIZE': (1920, 1080),
        'IMPLICIT_WAIT': 10,
        'PAGE_LOAD_TIMEOUT': 30,
    }
}

# 日志配置
LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'detailed': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '%(levelname)s - %(message)s'
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'simple',
            'stream': 'ext://sys.stdout'
        },
        'file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'level': 'DEBUG',
            'formatter': 'detailed',
            'filename': str(LOGS_DIR / 'scraper.log'),
            'maxBytes': 10485760,  # 10MB
            'backupCount': 5,
            'encoding': 'utf8'
        }
    },
    'loggers': {
        'web_scraper': {
            'level': 'DEBUG',
            'handlers': ['console', 'file'],
            'propagate': False
        }
    },
    'root': {
        'level': 'INFO',
        'handlers': ['console']
    }
}

# Markdown输出配置
MARKDOWN_CONFIG = {
    # 输出文件名格式
    'FILENAME_FORMAT': 'scraped_data_{date}.md',

    # 是否按网站分组
    'GROUP_BY_SOURCE': True,

    # 是否包含时间戳
    'INCLUDE_TIMESTAMP': True,

    # 表格格式
    'TABLE_FORMAT': {
        'ALIGN_LEFT': ['title', 'content'],
        'ALIGN_CENTER': ['registration_time', 'reply_time'],
        'ALIGN_RIGHT': ['reply_unit']
    }
}

# 数据验证配置
VALIDATION_CONFIG = {
    # 必填字段
    'REQUIRED_FIELDS': ['title', 'source_url'],

    # 字段长度限制
    'FIELD_LENGTH_LIMITS': {
        'title': 500,
        'registration_time': 50,
        'reply_unit': 200,
        'reply_time': 50,
        'content': 5000
    },

    # 时间格式验证
    'TIME_FORMATS': [
        r'\d{4}-\d{2}-\d{2}',
        r'\d{4}年\d{1,2}月\d{1,2}日',
        r'\d{4}/\d{1,2}/\d{1,2}'
    ]
}

# 环境变量配置
def get_env_config() -> Dict[str, Any]:
    """从环境变量获取配置"""
    return {
        'DEBUG': os.getenv('DEBUG', 'False').lower() == 'true',
        'LOG_LEVEL': os.getenv('LOG_LEVEL', 'INFO'),
        'HEADLESS_MODE': os.getenv('HEADLESS_MODE', 'True').lower() == 'true',
        'MAX_CONCURRENT_REQUESTS': int(os.getenv('MAX_CONCURRENT_REQUESTS', '1')),
    }

# 常量定义
class Constants:
    """常量定义类"""

    # 编码相关
    DEFAULT_ENCODING = 'utf-8'
    FALLBACK_ENCODINGS = ['gbk', 'gb2312', 'iso-8859-1']

    # HTTP状态码
    SUCCESS_STATUS_CODES = [200, 201, 202]

    # 文件扩展名
    MARKDOWN_EXTENSION = '.md'
    YAML_EXTENSION = '.yaml'

    # 时间格式
    DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
    DATE_FORMAT = '%Y-%m-%d'

    # 错误消息
    ERROR_MESSAGES = {
        'CONNECTION_ERROR': '连接失败',
        'TIMEOUT_ERROR': '请求超时',
        'PARSE_ERROR': '解析失败',
        'VALIDATION_ERROR': '数据验证失败',
        'CONFIG_ERROR': '配置错误'
    }

# 导出配置
__all__ = [
    'PROJECT_ROOT',
    'OUTPUT_DIR',
    'LOGS_DIR',
    'SCRAPER_CONFIG',
    'LOGGING_CONFIG',
    'MARKDOWN_CONFIG',
    'VALIDATION_CONFIG',
    'get_env_config',
    'Constants'
]
